package 位运算的骚操作;

/**
 * @author ljb
 * @version 1.0
 * @Date 2024/12/1
 */
// 给你两个整数 left 和 right ，表示区间 [left, right]
// 返回此区间内所有数字 & 的结果
// 包含 left 、right 端点
// 测试链接 : https://leetcode.cn/problems/bitwise-and-of-numbers-range/
public class Code04_LeftToRightAnd {
    // 0101001101 right 1.如果right==left 那么与之后，所有的1都能保留下来，直接返回
    // 0101001100 left 2.left<right，减一的状态一定在[left,right]区间存在，
    // 而这个状态的存在，会让right最右边的①，留不下来
    // 那么肯定最右边的1不能保留下来，因为区间里肯定有小于right，最右边为零的数。

    public int rangeBitwiseAnd(int left, int right) {
        while (left < right) {
            right -= right & -right;
        }
        return right;
    }
}
